package com.sxj.corejava.code11_io.字节流;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author 石小俊
 * @date 2025年02月21日
 */
public class Test04_对象输入输出流 {

    public static void main(String[] args) {
//        test01();
        test02();
    }

    /**
     * 序列化:将对象写入到IO流中,可以通过一个文件保存写入的IO流
     */
    public static void test01() {

        try (
                OutputStream out = new FileOutputStream("users.data");
                ObjectOutputStream oos = new ObjectOutputStream(out);
        ) {
            // 写入数据
            User user = new User(1, "admin", "111111");
            User user2 = new User(2, "jack", "222222");
            User user3 = new User(3, "tom", "333333");
            User user4 = new User(4, "lucy", "444444");
            // 在写入数据的时候,写入了几条数据,读取的时候也需要读取几条
//            oos.writeObject(user);
//            oos.writeObject(user2);
//            oos.writeObject(user3);
//            oos.writeObject(user4);

            // 当写入多条数据,读取的时候如果超过写入的数据条数,会报错
            // 为了防止需要多次读取,可以将所有的数据放到一个集合中一次性写入
            // 后期读取的时候也只需要读取一次即可
            List<User> users = new ArrayList<>(Arrays.asList(user, user2, user3, user4));
            oos.writeObject(users);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 反序列化:从IO流中读取对象
     */
    public static void test02() {
        try {
            //InputStream in = new FileInputStream("users.data");
            ObjectInputStream in = new ObjectInputStream(new FileInputStream("users.data"));
//            System.out.println(in.readObject());
//            System.out.println(in.readObject());
//            System.out.println(in.readObject());
//            System.out.println(in.readObject());
//            System.out.println(in.readObject());
            List<User> users = (List<User>) in.readObject();
            for (User user : users) {
                System.out.println(user);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

}

